package cn.lizemin.demo.thread.threadPool;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * @author: lizemin
 * @version: 1.0
 * 这是自定义的线程池类
 * 成员变量：
 * 任务队列     集合  需要控制线程安全问题
     * 当前线程数量
     * 核心线程数量
     * 最大线程数量
     * 任务队列的长度
 *
 * 成员方法
     * 1.提交任务
     * 2.执行任务
 */
public class MyThreadPool {
    //我不明白为什么要放一个任务的集合。
    //1.任务队列    集合  需要控制线程安全问题
    private List<Runnable> tasks = Collections.synchronizedList(new LinkedList<>());
    //2.当前线程数量
    private int num;
    //3.核心线程数量
    private int corePoolSize ; //
    //4.最大线程数量
    private int maxSize ; //
    //5.任务队列的长度
    private int workSize ; //

    public MyThreadPool(int corePoolSize, int maxSize, int workSize) {
        this.corePoolSize = corePoolSize;
        this.maxSize = maxSize;
        this.workSize = workSize;
    }

    //1.提交任务
    public void submit(Runnable r){
        //判断当前集合中任务的数量，是否超过了任务队列的长度，即是否还有座位
        if (tasks.size() >= workSize){
            System.out.println("任务："+r+"被丢弃了。。");
        }else {
            //添加到任务队列中
            tasks.add(r);

            //执行任务
            execTask(r);
        }
    }
    //执行任务
    private void execTask(Runnable r) {
        //判断当前线程池中的线程总数量，是否超过了核心数
        if (num < corePoolSize){
            new MyWorker("核心线程："+num,tasks).start();
            num++;
            r.run();

        }else if (num < maxSize){
            new MyWorker("非核心线程："+num,tasks).start();
            num++;

        }else {
            System.out.println("任务："+r+"被缓存了");

        }

    }
}
